package com.obrempon.credit.market.request

import com.obrempon.credit.market.ObremponApp
import com.obrempon.credit.market.configs.ObremponConfigs
import com.obrempon.credit.market.httptest.api.EventTrackApi
import com.obrempon.credit.market.httptest.api.UpdateImageApi
import com.obrempon.credit.market.httptest.interceptor.RequestInterceptor
import com.obrempon.credit.market.httptest.model.RequestHandler
import com.obrempon.credit.market.httptest.server.ReleaseServer
import com.obrempon.credit.market.httptest.server.TestServer
import com.obrempon.credit.market.utils.aes.ObremponAesUtil
import com.obrempon.credit.market.utils.log.ObremponLogger
import com.obrempon.module.easyhttp.EasyConfig
import com.obrempon.module.easyhttp.EasyHttp
import com.obrempon.module.easyhttp.body.JsonRequestBody
import com.obrempon.module.easyhttp.config.IRequestApi
import com.obrempon.module.easyhttp.lifecycle.ApplicationLifecycle
import com.obrempon.module.easyhttp.listener.HttpCallbackProxy
import com.obrempon.module.easyhttp.listener.OnHttpListener
import com.obrempon.module.easyhttp.listener.OnUpdateListener
import okhttp3.OkHttpClient
import org.json.JSONObject
import java.io.File

/**
 * HttpLoader
 * @Author wwdeng
 * @CreateTime: 2024/11/20 17:38
 * @Annotation：网络请求
 */
class HttpLoader: IHttpLoader {
    private var httpTag: Any? = null

    init {
        // 网络请求框架初始化
        val server = if (ObremponLogger.isDebug) {
            TestServer()
        } else {
            ReleaseServer()
        }
        val okHttpClient: OkHttpClient = OkHttpClient.Builder()
            .build()
        EasyConfig.with(okHttpClient)
            .setLogEnabled(ObremponLogger.isDebug)// 是否打印日志
            .setServer(server) // 设置服务器配置（必须设置）
            .setHandler(RequestHandler(ObremponApp.app)) // 设置请求处理策略（必须设置）
            .setInterceptor(RequestInterceptor())// 设置请求参数拦截器
            .setRetryCount(5)// 设置请求重试次数
            .setRetryTime(5000)// 设置请求重试时间
            .into()
        val headers = HashMap<String,String>()
        headers["appid"] = ObremponConfigs.OBREMPON_APPNAME
        headers["product"] = ObremponConfigs.OBREMPON_APPNAME
        EasyConfig.getInstance().setHeaders(headers)
    }

    /**
     * post 请求
     */
    override fun post(url: String, params: JSONObject,callback: IHttpCallback) {
//        val aesParams = ObremponAesUtil.encryptDefault(params.toString())
//        ObremponLogger.e("HttpUrl：  $url")
//        ObremponLogger.e("HttpParams： $params")
//        ObremponLogger.e("HttpParams AES：  $aesParams")

        EasyHttp.post(ApplicationLifecycle.getInstance())
//            .tag(httpTag)
            .api(url)
            .body(JsonRequestBody(params))
            .request(onHttpResultListener(callback))
    }

    override fun post(api: IRequestApi, callback: IHttpCallback) {
        EasyHttp.post(ApplicationLifecycle.getInstance())
            .api(api)
            .request(onHttpResultListener(callback))
    }

    /**
     * 文件上传
     */
    override fun upload(filePath: String, callback: OnUpdateListener<UpdateImageApi.ImageBean>) {
        if (filePath.isEmpty()){
            return
        }
        EasyHttp.post(ApplicationLifecycle.getInstance())
//            .tag(httpTag)
            .api(UpdateImageApi(File(filePath)))
            .request(callback)
    }

    /**
     * 添加打点事件
     */
    override fun addPoint(eventName: String, remark: String?, callback: IHttpCallback) {
        ObremponLogger.e(">>>>>>>>>>>>>>eventName：$eventName，remark：$remark")

        EasyHttp.post(ApplicationLifecycle.getInstance())
            .api(EventTrackApi().insertEventTrack(eventName,remark))
//            .tag(httpTag)
            .request(onHttpResultListener(callback))
    }

    private class onHttpResultListener(private val callback: IHttpCallback): OnHttpListener<String>{
        override fun onHttpSuccess(result: String) {
            val data = JSONObject(result)
            when(val code = data.optInt("code")){
                0 -> {
                    callback.onRequestSuccess(data)
                }
                else -> {
                    val errorObj = JSONObject()
                    errorObj.put("errorCode",code)
                    errorObj.put("errorMsg",data.optString("msg"))
                    callback.onRequestError(errorObj)
                }
            }
        }

        override fun onHttpFail(throwable: Throwable) {
            val errorObj = JSONObject()
            errorObj.put("errorCode",1001)
            errorObj.put("errorMsg",throwable.message)
            callback.onRequestError(errorObj)
        }

        override fun onHttpEnd(api: IRequestApi) {
            callback.onRequestFinish()
        }
    }

    /**
     * 设置请求tag
     */
    override fun setTag(tag: Any) {
        this.httpTag = tag
    }

    /**
     * 取消请求
     */
    override fun cancelTag(tag: Any) {
        EasyHttp.cancelByTag(tag)
    }
}